package ejb.cbm.seguridad.facade;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ejb.cbm.admin.entity.ParametroEntity;
import ejb.cbm.admin.local.ParametroSessionLocal;
import ejb.cbm.commons.BaseFacade;
import ejb.cbm.commons.ConstantsApp;
import ejb.cbm.commons.JdbcHelper;
import ejb.cbm.seguridad.bean.PerfilBean;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.RegistroPerfilBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.entity.RegistroPerfilEntity;
import ejb.cbm.seguridad.entity.UsuarioEntity;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;
import ejb.cbm.seguridad.local.RegistroPerfilFacadeLocal;
import ejb.cbm.seguridad.local.RegistroPerfilSessionLocal;
import ejb.cbm.seguridad.local.UsuarioFacadeLocal;
import ejb.cbm.seguridad.local.UsuarioSessionLocal;

////@Stateless(name="UsuarioFacade",mappedName="UsuarioFacade")
@Service("usuarioFacadeLocal")
public class UsuarioFacade extends BaseFacade implements UsuarioFacadeLocal {
	
	static Logger logger = Logger.getLogger(UsuarioFacade.class.getName());
	
	//@EJB
	
	private UsuarioSessionLocal usuarioSessionLocal;
	
	@Autowired
	public void setUsuarioSessionLocal(UsuarioSessionLocal usuarioSessionLocal) {
		this.usuarioSessionLocal = usuarioSessionLocal;
	}

	//@EJB
	private PerfilFacadeLocal perfilFacadeLocal;
	
	@Autowired
	public void setPerfilFacadeLocal(PerfilFacadeLocal perfilFacadeLocal) {
		this.perfilFacadeLocal = perfilFacadeLocal;
	}

	//@EJB
	@Autowired
	public ParametroSessionLocal parametroSessionLocal;
	
	public void setParametroSessionLocal(ParametroSessionLocal parametroSessionLocal) {
		this.parametroSessionLocal = parametroSessionLocal;
	}

	//@EJB
	@Autowired
	public RegistroPerfilSessionLocal registroPerfilSessionLocal;
	
	public void setRegistroPerfilSessionLocal(
			RegistroPerfilSessionLocal registroPerfilSessionLocal) {
		this.registroPerfilSessionLocal = registroPerfilSessionLocal;
	}

	//@EJB
	@Autowired
	public RegistroPerfilFacadeLocal registroPerfilFacadeLocal;

	////@Resource(mappedName="java:/jdbc/CONNEG")
	//this.protected DataSource dsContinuidad;
	
	
	public void setRegistroPerfilFacadeLocal(
			RegistroPerfilFacadeLocal registroPerfilFacadeLocal) {
		this.registroPerfilFacadeLocal = registroPerfilFacadeLocal;
	}

	/* (non-Javadoc)
	 * //@see cbm.seguridad.facade.UsuarioFacadeLocal#obtenerDatosInicializacion()
	 */
	public HashMap<String, Object> obtenerDatosInicializacion(){
		return null;
	}

	/* (non-Javadoc)
	 * //@see cbm.seguridad.facade.UsuarioFacadeLocal#save(cbm.seguridad.bean.UsuarioBean, cbm.seguridad.bean.UsuarioBean)
	 */
	@Transactional(propagation=Propagation.REQUIRED)
	public void save(UsuarioBean usuarioBean,UsuarioBean usuarioLogeado){
		UsuarioEntity entity = null;
		RegistroPerfilEntity entityRegistroPerfil = null;
		RegistroPerfilBean filtro = null;
		try{
			entity = usuarioSessionLocal.findById(usuarioBean.getCodigousuario());
			if(entity == null){
				entity = new UsuarioEntity(usuarioBean.getCodigousuario(),
										   usuarioBean.getCodigooficina(),
										   usuarioBean.getCodigoPuesto(),
										   usuarioBean.getNombre(),
										   usuarioBean.getApellidopaterno(),
										   usuarioBean.getApellidomaterno(),
										   usuarioBean.getTelefono(),
										   usuarioBean.getClave(),
										   usuarioBean.getCorreoelectronico(),
										   usuarioBean.getFlagldap(),
										   usuarioBean.getFlagactivo(),
										   usuarioLogeado.getCodigousuario(),
										   new Date(),
										   usuarioLogeado.getCodigousuario(),
										   new Date()
										   );
				usuarioSessionLocal.save(entity);
				
				if (usuarioBean.getPerfilBean().getCodigoperfil() != null){ 
					entityRegistroPerfil = new RegistroPerfilEntity(
												null,
												usuarioBean.getPerfilBean().getCodigoperfil(),
												new Long(1),
												usuarioBean.getCodigousuario(),
												"",
												ConstantsApp.ESTADO_ACTIVO,
												usuarioLogeado.getCodigousuario(),
											    new Date(),
											    usuarioLogeado.getCodigousuario(),
											    new Date()
										       );
					registroPerfilSessionLocal.save(entityRegistroPerfil);
				}
			}else{
				if(usuarioBean.getCodigooficina()!= null) entity.setCodigooficina(usuarioBean.getCodigooficina());
				if(usuarioBean.getApellidopaterno()!= null) entity.setApellidopaterno(usuarioBean.getApellidopaterno());
				if(usuarioBean.getApellidomaterno()!=null)entity.setApellidomaterno(usuarioBean.getApellidomaterno());
				if(usuarioBean.getNombre()!=null)entity.setNombre(usuarioBean.getNombre());
				if(usuarioBean.getTelefono()!=null)entity.setTelefono(usuarioBean.getTelefono());
				if(usuarioBean.getCorreoelectronico()!=null)entity.setCorreoelectronico(usuarioBean.getCorreoelectronico());
				if(usuarioBean.getClave()!=null)entity.setClave(usuarioBean.getClave());
				if(usuarioBean.getFlagldap()!=null)entity.setFlagldap(usuarioBean.getFlagldap());
				if(usuarioBean.getFlagactivo()!=null)entity.setFlagactivo(usuarioBean.getFlagactivo());
				entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
				entity.setFechamodificacion(new Date());
				
				usuarioSessionLocal.update(entity);
				
				filtro = new RegistroPerfilBean();
				filtro.setValorregistro(usuarioBean.getCodigousuario());
				
				List<RegistroPerfilEntity> lstRegistroPerfil = registroPerfilSessionLocal.findByFiltro(filtro);
				
				if (usuarioBean.getPerfilBean().getCodigoperfil() != null 
							&& lstRegistroPerfil != null && lstRegistroPerfil.size()>0){ 
					
					for(RegistroPerfilEntity entityRegPer :lstRegistroPerfil){
						entityRegPer.setCodigoperfil(usuarioBean.getPerfilBean().getCodigoperfil());
						entityRegPer.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
						entityRegPer.setFlagactivo(ConstantsApp.ESTADO_ACTIVO);
						entityRegPer.setFechamodificacion(new Date());
						registroPerfilSessionLocal.update(entityRegPer);
					}
					
				}else if (usuarioBean.getPerfilBean().getCodigoperfil() != null 
							&& lstRegistroPerfil != null && lstRegistroPerfil.size()==0) {	
					entityRegistroPerfil = new RegistroPerfilEntity(
							null,
							usuarioBean.getPerfilBean().getCodigoperfil(),
							new Long(1),
							usuarioBean.getCodigousuario(),
							"",
							ConstantsApp.ESTADO_ACTIVO,
							usuarioLogeado.getCodigousuario(),
						    new Date(),
						    usuarioLogeado.getCodigousuario(),
						    new Date()
					       );
 
					registroPerfilSessionLocal.save(entityRegistroPerfil);

				}else if (usuarioBean.getPerfilBean().getCodigoperfil() == null){
					for(RegistroPerfilEntity entityRegPer :lstRegistroPerfil){
						entityRegPer.setFlagactivo(ConstantsApp.ESTADO_INACTIVO);
						entityRegPer.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
						entityRegPer.setFechamodificacion(new Date());
						registroPerfilSessionLocal.update(entityRegPer);
					}
				}
			}
		
		}catch(RuntimeException e){
			e.printStackTrace();logger.error(e);
		}
	}

	public List<UsuarioBean> buscar(UsuarioBean filtro,RegistroIngresoBean registroIngreso) throws Exception{
		
		List<UsuarioBean> beans = new ArrayList<UsuarioBean>();
		List<UsuarioBean> listResult = null;
		ParametroEntity parametro = null;
		Connection con = null;
		RegistroPerfilBean registroPerfil = null;
		PerfilBean perfil = null;
		
		try{
			
			con = this.getConnection();
			
			listResult = usuarioSessionLocal.findUsuarios(con,filtro,registroIngreso);
																	
			for(UsuarioBean beanRes : listResult){
				//Obtiene el registro perfil asignado directamente al codigo del usuario. Si no existe perfil
				//asignado devuelve nulo				
				registroPerfil = registroPerfilFacadeLocal.buscar(ConstantsApp.TIPO_REGISTRO_USUARIO,beanRes.getCodigousuario());
				
				//Se obtiene el perfil
				if(registroPerfil != null){
					perfil = perfilFacadeLocal.buscar(registroPerfil.getCodigoperfil());
				}else{
					perfil = perfilFacadeLocal.buscar(ConstantsApp.PERFIL_NO_ASIGNADO);
				}
				
				beanRes.setPerfilBean(perfil);
				parametro = parametroSessionLocal.findParametro(ConstantsApp.TIPO_PARAMETRO_ESTADO_REGISTRO, new Double(beanRes.getFlagactivo()));
				String descflagestado = parametro.getDescripcion();
				beanRes.setDescActivo(descflagestado);
				beans.add(beanRes);
			}
		} catch (Exception e) {
			throw e;
		} finally{
			JdbcHelper.close(con,null,null,null,null);
		}

		return beans;
	}

	public UsuarioBean buscar(String codigoUsuario){
		UsuarioBean bean = new UsuarioBean();
		UsuarioEntity entity = usuarioSessionLocal.findById(codigoUsuario.toUpperCase());
		
		try{
			BeanUtils.copyProperties(bean, entity);
			PerfilBean perfilBean = perfilFacadeLocal.obtienePerfilByCodigoUsuario(bean); 
			bean.setPerfilBean(perfilBean);
			
		}catch(IllegalAccessException e){
			//throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
			return null;
		}catch(InvocationTargetException e){
			//throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
			return null;
		} catch (SQLException e) {
			//throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
			return null;
		}catch(Exception e){
			return null;
		}
		
		return bean;
	}
}